package com.cjb.cloudsystem.task;

import com.cjb.cloudsystem.entity.SysMsg;
import com.cjb.cloudsystem.enums.SendMsgEnum;
import com.cjb.cloudsystem.service.SysMsgService;
import com.cjb.cloudsystem.vo.SearchMsgVO;
import com.cjb.cloudsystem.vo.SysMsgVO;
import com.cjb.common.common.cache.RedisCache;
import com.cjb.common.util.Common;
import com.cjb.common.util.JsonUtils;
import com.cjb.eighteenart.util.MsgAPIUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @Author chenjinbin
 * @Package IntelliJ IDEA
 * @Class SendSubTask
 * @Date 2024-03-15 22:02
 */
@Slf4j
@Component
public class SendSubTask {
    /**
     * 邮箱服务类
     */
    @Autowired
    private MsgAPIUtil msgAPIUtil;

    /**
     * 注入信息服务类
     */
    @Autowired
    private SysMsgService sysMsgService;

    /**
     * 发送检查发送邮箱
     *
     * @Author chenjinbin
     * @Value
     * @Title
     */
    // 每5秒执行一次runEveryFiveSeconds方法
    @Scheduled(fixedRate = 6000*5)
    public void runEveryFiveSeconds() {
        System.out.println("任务执行: " + System.currentTimeMillis());
        inspectMail();
    }

    /**
     * 发送检查发送邮箱
     *
     * @Author chenjinbin
     * @Value
     * @Title
     */
    private void inspectMail() {
        //检查redis服务 高于预期
        SysMsgVO vo = new SysMsgVO();
        //订阅1 不订阅0
        vo.setOperate(1);
        List<SysMsg> sysMsgs = sysMsgService.queryList(vo);
        sysMsgs.forEach(item -> {
            //类型转化
            if(item.getOperate().equals(1)){
                if (Common.isNotEmpty(item) && Common.isNotEmpty(item.getMsgSendEmail()) && Common.isNotEmpty(item.getSubRule())) {
                    //判断规则 高于预期 且符合比较条件
                    if (item.getSubRule().equals(0) &&Common.isNotEmpty(item.getMsgTheme()) && Boolean.FALSE.equals(comparePrice(item.getMsgTheme(), item.getExpectPrice().toString()))) {
                        //发送邮件
                        try {
                            log.info("====================================");
                            msgAPIUtil.contextLoads(item.getMsgTheme(), SendMsgEnum.HIGHER.getName()+"商品预期价格"+item.getExpectPrice()+"元", item.getMsgSendEmail());
                            unsubscribe(item);
                        } catch (Throwable e) {
                            throw new RuntimeException(e);
                        }
                    }
                    //低于预期 且符合比较条件
                    if (item.getSubRule().equals(1) && Boolean.TRUE.equals(comparePrice(item.getMsgTheme(), item.getExpectPrice().toString()))) {
                        //发送邮件
                        try {
                            msgAPIUtil.contextLoads(item.getMsgTheme(), SendMsgEnum.BELOW.getName()+"商品预期价格"+item.getExpectPrice()+"元", item.getMsgSendEmail());
                            unsubscribe(item);
                        } catch (Throwable e) {
                            throw new RuntimeException(e);
                        }
                    }
                }
            }
        });
    }

    /**
     * 期望值比较函数，用于比较商品期望价格与实际价格
     *
     * @param goodName 商品名称
     * @param expectPrice 期望价格
     * @return 如果实际价格小于等于期望价格，返回false；否则返回true；如果查询不到商品信息，返回null
     */
    private Boolean comparePrice(String goodName, String expectPrice) {
        SearchMsgVO searchMsgVO = sysMsgService.searchArt(goodName);
        log.info("打印当前值: {}",JsonUtils.toJsonString(searchMsgVO));
        if (Common.isNotNull(searchMsgVO) && Common.isNotEmptyVales(searchMsgVO.getPrice(), expectPrice)) {
            //比较价格
            return new BigDecimal(searchMsgVO.getPrice()).compareTo(new BigDecimal(expectPrice)) < 0;
        } else {
            return null;
        }
    }

    /**
     * 取消订阅
     *
     * @Author chenjinbin
     * @Value
     * @Title
     */
    private void unsubscribe(SysMsg sysMsg) {
       //数据库执行订阅取消
        sysMsg.setOperate(0);
        //更新
        List<SysMsg> sysMsgs = new ArrayList<>();
        sysMsgs.add(sysMsg);
        sysMsgService.listUpdate(sysMsgs);
    }


}
